package cn.bytets.rpc.common.bytecode;

import cn.bytets.rpc.common.utils.ClassUtils;
import cn.bytets.rpc.common.utils.ReflectUtils;

import java.lang.ref.Reference;
import java.lang.ref.WeakReference;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.*;
import java.util.concurrent.atomic.AtomicLong;

/**
 * 使用javassist 字节码方式使接口实现了这个抽象抽象类,
 * 在反射的时候会调用 newInstance这个方法,
 * 而 newInstance 这个方法是有 javassist 生成的,里面则是执行了 InvocationHandler.invoke方法。
 * 具体实现的逻辑我们只要执行了InvocationHandler这个接口即可
 */
public abstract class Proxy {

    public static final InvocationHandler THROW_UNSUPPORTED_INVOKER = new InvocationHandler() {
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) {
            throw new UnsupportedOperationException("Method [" + ReflectUtils.getName(method) + "] unimplemented.");
        }
    };

    protected Proxy(){}

    public Object newInstance(){
        return newInstance(THROW_UNSUPPORTED_INVOKER);
    }
    public abstract Object newInstance(InvocationHandler handler);
}
